package com.wrt.wm.util;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.imageio.ImageIO;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.wrt.wm.entity.FontParameters;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.log4j.Log4j2;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Positions;

/**
 * 
 * 水印添加工具
 * @author 文瑞涛
 * 
 */
@Component
@Getter
@Setter
@Log4j2
public class WaterMarkUtil {

	private FontParameters fontParam;
	
	@Value("${temppath.temp:temp}")
	@Getter(AccessLevel.NONE)
	@Setter(AccessLevel.NONE)
	private String temp;
	
	@Value("${temppath.wm:temp_wm}")
	@Getter(AccessLevel.NONE)
	@Setter(AccessLevel.NONE)
	private String wm;

	/**
	 * 图片添加文字水印
	 * 
	 * @param srcImgPath       需要添加水印的图片的路径
	 * @param waterMarkContent 水印的文字
	 * 
	 * @return 添加水印后图片输出路径
	 */
	public String mark(String srcImgPath, String waterMarkContent) {
		String outImgPath = getOutImgPath(srcImgPath);
		try (FileOutputStream outImgStream = new FileOutputStream(outImgPath);) {
			// 读取原图片信息
			File srcImgFile = new File(srcImgPath);
			Image srcImg = ImageIO.read(srcImgFile);
			int srcImgWidth = srcImg.getWidth(null);
			int srcImgHeight = srcImg.getHeight(null);

			BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
			Graphics2D g = bufImg.createGraphics();
			g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
			// 字体设置
			fontSetting(g);
			// 添加水印
			addMark(g, waterMarkContent, srcImgWidth, srcImgHeight);
			g.dispose();
			// 输出图片
			ImageIO.write(bufImg, FilenameUtils.getExtension(srcImgFile.getName()), outImgStream);
			outImgStream.flush();
		} catch (Exception e) {
			log.error(e.getMessage(), e);
		}
		return outImgPath;
	}

	/**
	 * 图片添加图片水印
	 * 
	 * @param srcImgPath 需要添加水印的图片的路径
	 * @param wmImgPath  水印图片
	 * @param position   水印位置
	 * @param alpha      透明度
	 * 
	 * @return 添加水印后图片输出路径
	 */
	public String mark(String srcImgPath, String wmImgPath, Positions position, Float alpha) {
		String outImgPath = getOutImgPath(srcImgPath);
		try {
			Thumbnails.of(srcImgPath).scale(1.0).watermark(position, ImageIO.read(new File(wmImgPath)), alpha)
					.outputQuality(1.0).toFile(outImgPath);
		} catch (IOException e) {
			log.error(e.getMessage(), e);
		}
		return outImgPath;
	}

	/**
	 * 
	 * 添加文字水印
	 * @param g 绘图对象
	 * @param waterMarkContent 水印内容
	 * @param srcImgWidth 图片宽度
	 * @param srcImgHeight 图片高度
	 * 
	 */
	private void addMark(Graphics2D g, String waterMarkContent, int srcImgWidth, int srcImgHeight) {
		if (StringUtils.isBlank(waterMarkContent)) {
			waterMarkContent = "默认水印";
		}
		int width = getWatermarkLength(waterMarkContent, g);
		// 图片的高 除以 文字水印的宽 打印的行数(以文字水印的宽为间隔)
		int rowsNumber = srcImgHeight / width + srcImgHeight % width;
		// 图片的宽 除以 文字水印的宽 每行打印的列数(以文字水印的宽为间隔)
		int columnsNumber = srcImgWidth / width + srcImgWidth % width;
		// 防止图片太小而文字水印太长，所以至少打印一次
		if (rowsNumber < 1) {
			rowsNumber = 1;
		}
		if (columnsNumber < 1) {
			columnsNumber = 1;
		}
		for (int j = 0; j < rowsNumber; j++) {
			for (int i = 0; i < columnsNumber; i++) {
				// 画出水印,并设置水印位置
				g.drawString(waterMarkContent, i * width + j * width, -i * width + j * width);
			}
		}
	}

	/**
	 * 
	 * 在绘图对象中设置字体
	 * 
	 * @param g 绘图对象
	 *
	 */
	private void fontSetting(Graphics2D g) {
		Font font = this.fontParam.createFont();
		// 设置字体
		g.setFont(font);
		// 设置水印文字透明度 默认为1.0 值越小颜色越浅
		g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, this.fontParam.getAlpha()));
		// 设置水印旋转
		g.rotate(Math.toRadians(this.fontParam.getDegree()));
		// 水印颜色
		g.setColor(this.fontParam.gainFontColor());
		// 渐变色
		g.setPaint(new GradientPaint(0, 0, this.fontParam.gainFontColor(), 50, 30, this.fontParam.gainFontEndColor(), true));
	}

	/**
	 * 获取水印文字总长度
	 * 
	 * @param waterMarkContent 水印的文字
	 * @param g
	 * @return 水印文字总长度
	 */
	private int getWatermarkLength(String waterMarkContent, Graphics2D g) {
		return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
	}

	/**
	 * 
	 * 获取输出地址
	 * 
	 * @param srcImgPath 图片地址
	 * 
	 * @return 输出地址
	 * 
	 */
	private String getOutImgPath(String srcImgPath) {
		File outImgDir = new File(wm);
		if (!outImgDir.exists()) {
			outImgDir.mkdir();
		}
		return srcImgPath.replaceFirst(temp, wm);
	}

}
